<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    console.log("1");

setTimeout(() => {
  console.log("2")
  Promise.resolve().then(() => {
    console.log("3")
  })
}, 0)

new Promise(function(resolve, reject) {
  console.log("4")
  setTimeout(function() {
    console.log("5")
    resolve("6")
  }, 0)
}).then(res => {
  console.log("7")
  setTimeout(() => {
    console.log(res)
  }, 0)
})
  </script>
</body>
</html>
https://mp.weixin.qq.com/s/VjKqAmMgTZodik0T8cG71A练习题
事件循环，同步任务放入执行栈中执行，异步任务分为宏任务和微任务。
两者区别：

宏任务：DOM 渲染后触发，如 setTimeout 、setInterval 、DOM 事件 、script 。（等待队列中的任务先到执行时间的就先执行，如果等待任务队列中有两个同时到执行时间的异步代码，那么先入队列的就先到主栈中执行）
微任务：DOM 渲染前触发，如 Promise.then 、MutationObserver 、Node 环境下的 process.nextTick 。

从 event loop 解释，为何微任务执行更早？

微任务是 ES6 语法规定的（被压入 micro task queue）。
宏任务是由浏览器规定的（通过 Web APIs 压入 Callback queue）。
宏任务执行时间一般比较长。
每一次宏任务开始之前一定是伴随着一次 event loop 结束的，而微任务是在一次 event loop 结束前执行的
